package HighLevelFunction

object WordCount {
  /**
   * 将集合中出现的相同的单词进行计数，取计数排名前三的结果
   * 先把列表打散flatMap或map，打散之后进行分组groupBy，分组之后进行计数sum，再取前三
   */
  def main(args: Array[String]): Unit = {
    val stringList: List[String] = List(
      "hello",
      "hello world",
      "hello scala",
      "hello spark",
      "hello spark from scala",
      "hello flink from scala"
    )
    //1、对字符串进行按空格进行打散，得到一个打散的列表
    val worldList1 = stringList.flatMap((elem: String) => {
      elem.split(" ")
    })
    println(worldList1)
    //List(hello, hello, world, hello, scala, hello, spark, hello, spark, from, scala, hello, flink, from, scala)
    //或者还可以像以下实现
    //    val worldList2: List[Array[String]] = stringList.map((elem: String) => {
    //      elem.split(" ")
    //    })
    //    println(worldList2.flatten)
    // [Ljava.lang.String;@17695df3,[Ljava.lang.String;@6c9f5c0d,[Ljava.lang.String;@de3a06f,[Ljava.lang.String;@76b10754,[Ljava.lang.String;@2bea5ab4,[Ljava.lang.String;@3d8314f0
    //2、将相同的单词进行分组
    val wordMap: Map[String, List[String]] = worldList1.groupBy((word: String) => {
      word
    })
    println(wordMap)
    //3、对分组后的list取长度，得到每个单词的个数,得到（k,size）
    val countMap: Map[String, Int] = wordMap.map(
      kv => (kv._1, kv._2.length)
    )
    println(countMap)
    //4、将map转换为list，并排序取前三
    val sortList: List[(String, Int)] =countMap.toList.sortWith((_._2>_._2))
    println(sortList)
    //取前三take(3)
    println(sortList.take(3))

  }
}
